# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/10/14
# @File : 26.E - Mod i.py
"""
dp[i][j]表示前i个数分成j组的方案数.

dp[0][0]=1;
for(int i=1;i<=n;++i){
  for(int j=1;j<=i;++j){
    for(int k=0;k<i;++k){
      if((sum[i]-sum[k])%j) continue;
      dp[i][j]=(dp[i][j]+dp[k][j-1])%mod;
    }
  }
}#超时做法，直接转移是O（n^3）所以要优化。
(sum[i]-sum[k])%j=0可以变为sum[i]%j=sum[k]%j,
那么我们只需要预处理出满足sum[k]%j=sum[i]%j的所有位置的d[k][j-1]的和即可,
"""
def dp_solve():
    sum_ = [0] * (n+1)
    for i in range(1,n+1):
        sum_[i] = sum_[i-1] + a[i]#前缀和数组
    dp = [[0]*(n+1) for _ in range(n+1)]
    # dp[0][0] = 1 超时做法就需要，因为那种做法没有前缀和数组
    pre_k = [[0]*(n+1) for _ in range(n+1)]
    pre_k[1][0] = 1#j为1，t为0；j为1的时候不管是什么模j都是0。所以就是只有一个分组，所以是1.
    for i in range(1,n+1):#内层两个for的顺序是因为下一个i就用到前面的，不包括自己，所以保证了优化前k<i的条件
        for j in range(1,i+1):
            t = sum_[i]%j#不同j可以得到相同t，所以要指定你某个j得到的某个t
            dp[i][j] = pre_k[j][t]
        for j in range(1,n+1):#更新到i+1是不行的，因为这样就会有一部分没更新，因为计算的是前缀和 ，到时候j到n的时候，是会用到i+1~n的j的。所以要全部计算1~n的。
            tt = sum_[i]%j
            pre_k[j][tt] = (pre_k[j][tt] + dp[i][j-1])%modulo#累加

    ans = sum(dp[n])%modulo#总和才是the number of ways to separate the sequence so that the condition in the Problem Statement is satisfied，
    #所以是n个数分成1~n段的且符合题目条件的所有方法数之和

    return ans


if __name__ == '__main__':
    modulo = 10 ** 9 + 7
    n = int(input())
    a = [0]+list(map(int,input().split()))#a数组只用来计算前缀和数组，后面就不会再用到。
    ans = dp_solve()
    print(ans)